﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace SST_DA
{
    public class CircuitoDA
    {
        /// <summary>
        /// Con esta funcion se agrega un circuito a la base de datos.
        /// </summary>
        /// <param name="c">Un objeto circuito, este debe de tener los parametros Nombres y codigo para que sean agregados en la base de datos.</param>
        /// <returns>TRUE si el circuito fue agregado, FALSE de lo contrario</returns>
        public static bool AgragarCircuito(Circuito c) {
            object[] parametrosUpdate = { c.nombreCircuito, c.codigoCircuito };
            string[] nombreParametrosUpdate = { "@nombreCircuito", "@codigoCircuito" };
            const string updateQuery = "UPDATE Circuito SET FechaBorrado = NULL WHERE NombreCircuitoID = @nombreCircuito OR CircuitoCodigo = @codigoCircuito";
            int updateRows = BaseDatos.ExecuteNonQuery(updateQuery, nombreParametrosUpdate, parametrosUpdate);
            if (updateRows == 0)
            {
                const string query = "INSERT INTO Circuito(NombreCircuito, CodigoCircuito) VALUES(@nombreCircuito, @codigoCircuito)";
                object[] parametros= { c.nombreCircuito, c.codigoCircuito };
                string[] nombreParametros = { "@nombreCircuito", "@codigoCircuito" };
                int rows = BaseDatos.ExecuteNonQuery(query, nombreParametros, parametros);
                return rows > 0;
            }//if (updateRows == 0)
            return updateRows > 0;
        }//public static bool AgragarCircuito(Circuito c) { 

        /// <summary>
        /// Lista todos los circuitos que no hayan sido eliminados
        /// </summary>
        /// <returns> un Circuito[] con todos los circuitos.</returns>
        public static Circuito[] ListarCircuito() {
            const string query = "SELECT CircuitoID, NombreCircuito, CodigoCircuito FROM Circuito WHERE FechaBorrado IS NULL ";
            object[] parametros = {  };
            string[] nombreParametros = {  };
            DataTable resultado = BaseDatos.ExecuteQuery(query, nombreParametros, parametros);
            int CantidadCircuitos = resultado.Rows.Count;
            Circuito[] circuitos = new Circuito[CantidadCircuitos];
            for (int i = 0; i < CantidadCircuitos; i++ )
            {
                circuitos[i] = new Circuito(int.Parse(resultado.Rows[i].ItemArray[0].ToString()),
                                            resultado.Rows[i].ItemArray[1].ToString(),
                                            resultado.Rows[i].ItemArray[2].ToString());
            }//for (int i = 0; i < CantidadCircuitos; i++ )
            return circuitos;
        }//public static Circuito[] ListarCircuito() { 

        /// <summary>
        /// Esta funcion retorna un circuito en base al nombre o al circuito.
        /// </summary>
        /// <param name="nombre">El nombre del circuito</param>
        /// <param name="codigo">EL codigo de un circuito.</param>
        /// <returns>Un objecto circuito, en base a los parametros</returns>
        public static Circuito GetCircuito(string nombre, string codigo) {
            const string query = "exec GetCircuito @nombre, @codigo";
            object[] parametros = { nombre, codigo };
            string[] nombreParametros = { "@nombre", "@codigo" };
            DataTable resultado = BaseDatos.ExecuteQuery(query , nombreParametros, parametros);
            if (resultado == null || resultado.Rows.Count == 0)
                return null;
            int circuitoID = int.Parse(resultado.Rows[0].ItemArray[0].ToString());
            
            return new Circuito(circuitoID, resultado.Rows[0].ItemArray[1].ToString(), resultado.Rows[0].ItemArray[2].ToString());
        }//public static Circuito GetCircuito(string nombre, string codigo) { 

        /// <summary>
        /// Busca un circuito en la base de datos en base a su ID
        /// </summary>
        /// <param name="id">El ID del circuito a buscar.</param>
        /// <returns>Un objeto circuito</returns>
        public static Circuito GetCircuito(int id) {
            const string query = "SELECT CircuitoID, NombreCircuito, CodigoCircuito FROM Circuito WHERE CircuitoID= @ID AND FechaBorrado IS NULL";
            object[] parametros = { id};
            string[] nombreParametros = { "@ID" };
            DataTable resultado = BaseDatos.ExecuteQuery(query, nombreParametros, parametros);
            if (resultado == null || resultado.Rows.Count == 0)
                return null;
            return new Circuito(int.Parse(resultado.Rows[0].ItemArray[0].ToString()), resultado.Rows[0].ItemArray[1].ToString(), resultado.Rows[0].ItemArray[2].ToString());
        }//public static Circuito GetCircuito(int id) { 

        /// <summary>
        /// Buscan un circuito en base al nombre. 
        /// </summary>
        /// <param name="nombre">El nombre para buscar el circuito.</param>
        /// <returns></returns>
        public static Circuito GetCircuito(string nombre)
        {
            const string query = "SELECT CircuitoID, NombreCircuito, CodigoCircuito FROM Circuito WHERE NombreCircuito= @nombre AND FechaBorrado IS NULL";
            object[] parametros = { nombre };
            string[] nombreParametros = { "@nombre" };
            DataTable resultado = BaseDatos.ExecuteQuery(query, nombreParametros, parametros);
            if (resultado == null || resultado.Rows.Count == 0)
                return null;
            return new Circuito(int.Parse(resultado.Rows[0].ItemArray[0].ToString()), resultado.Rows[0].ItemArray[1].ToString(), resultado.Rows[0].ItemArray[2].ToString());
        }//public static Circuito GetCircuito(string nombre)


        /// <summary>
        /// Activa la bandera de borrado logico en la base de datos.
        /// </summary>
        /// <param name="id">El ID el circuito a borrar</param>
        /// <returns>true si el circuito fue borrado y 0 de lo contrario</returns>
        public static bool EliminarCircuito(int id) {
            const string query = "UPDATE Circuito SET FechaBorrado = GETDATE() WHERE CircuitoID = @ID";
            object[] parametros = { id };
            string[] nombreParametros = { "@ID" };
            int rows = BaseDatos.ExecuteNonQuery(query, nombreParametros, parametros);
            return rows > 0;
        }//public static bool EliminarCircuito() {

        /// <summary>
        /// Edita un circuito, solamente se puede editar el nombre y el codigo
        /// </summary>
        /// <param name="id">ID del circuito a editar</param>
        /// <param name="nombre">Nombre a cambiar</param>
        /// <param name="codigo">Codigo a cambiar.</param>
        /// <returns>true si fue editado y false de lo contrario.</returns>
        public static bool EditarCircuito(int id, string nombre, string codigo) {
            const string query = "UPDATE Circuito SET NombreCircuito=@nombre, CodigoCircuito =@codigo  WHERE CircuitoID = @ID AND FechaBorrado IS NULL";
            object[] parametros = { nombre, codigo, id };
            string[] nombreParametros = { "@nombre", "@codigo", "@ID" };
            int rows = BaseDatos.ExecuteNonQuery(query, nombreParametros, parametros);
            return rows > 0;
        }//public static bool EditarCircuito(int id, string nombre, string codigo) { 

        public static int[] GetCircuitosDeInformatico(int informaticoID) {
            const string query = "exec GetCircuitosDeInformatico @informatico";
            object[] parametros = { informaticoID };
            string[] nombreParametros = { "@informatico" };
            DataTable resultado = BaseDatos.ExecuteQuery(query, nombreParametros, parametros);
            int CantidadCircuitos = resultado.Rows.Count;
            int[] circuitos = new int[CantidadCircuitos];
            for (int i = 0; i < CantidadCircuitos; i++)            
                circuitos[i] = int.Parse(resultado.Rows[i].ItemArray[0].ToString());            
            return circuitos;
        }

    }//public class CircuitoDA
}//namespace SST_DA
